﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using SIGERP_Entidades;
using System.Data.SqlClient;

namespace SIGERP_Datos
{
    public class HndUsuario
    {
        public static List<Usuario> getAll()
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT * FROM dbo.usuario");
            var usuarios = new List<Usuario>();
            foreach (DataRow dtRow in tabla.Rows)
            {
                Usuario u = new Usuario(dtRow);
                u.departamentos = HndDepartamento.getAllWhereUser(u);
                u.tipo = HndTipoUsuario.getOne(Convert.ToInt32(dtRow["id_tipo_usuario"]));
                usuarios.Add(u);
            }
            return usuarios;
        }

        public static Usuario getOne(int id)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT TOP 1 * FROM dbo.usuario WHERE id_usuario=" + id);
            DataRow dtRow = tabla.Rows[0];
            Usuario u = new Usuario(dtRow);
            u.departamentos = HndDepartamento.getAllWhereUser(u);
            u.tipo = HndTipoUsuario.getOne(Convert.ToInt32(dtRow["id_tipo_usuario"]));
            return u;
        }

        public static int getNextId()
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT MAX(id_usuario) as id FROM sigerp.dbo.usuario");
            DataRow dtRow = tabla.Rows[0];

            int id = 0;
            try
            {
                id = Convert.ToInt32(dtRow["id"]);
            }
            catch { 
            
            }
            return id+1;
        }

        public static Boolean insert(Usuario usuario)
        {
            usuario.id=getNextId();
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "SET IDENTITY_INSERT dbo.usuario ON; INSERT INTO dbo.usuario (id_usuario,nombre_de_usuario,pass,apellido,nombre,email,habilitado,id_tipo_usuario) " +
            " VALUES (@id,@descripcion,@pass,@apellido,@nombre,@email,1,@tipo); SET IDENTITY_INSERT dbo.usuario OFF;";
            comando.Parameters.AddWithValue("@id", usuario.id);
            comando.Parameters.AddWithValue("@descripcion", usuario.descripcion.ToUpper());
            comando.Parameters.AddWithValue("@pass", usuario.pass);
            comando.Parameters.AddWithValue("@apellido", usuario.apellido);
            comando.Parameters.AddWithValue("@nombre", usuario.nombre);
            comando.Parameters.AddWithValue("@email", usuario.email);
            comando.Parameters.AddWithValue("@tipo", usuario.tipo.id);
            bool ejecuta = true;
            if(Conexion.ejecutaComando(comando)==false) ejecuta=false;
            if (HndUsuarioDepartamentos.insert(usuario) == false) ejecuta = false;
            return ejecuta;
        }

        public static Boolean update(Usuario usuario)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "UPDATE dbo.usuario SET nombre_de_usuario=@descripcion,apellido=@apellido,nombre=@nombre,email=@email,habilitado=@habilitado,id_tipo_usuario=@tipo WHERE id_usuario=@id";
            comando.Parameters.AddWithValue("@descripcion", usuario.descripcion.ToUpper());
            comando.Parameters.AddWithValue("@apellido", usuario.apellido);
            comando.Parameters.AddWithValue("@nombre", usuario.nombre);
            comando.Parameters.AddWithValue("@email", usuario.email);
            if (usuario.habilitado) comando.Parameters.AddWithValue("@habilitado", 1);
            else comando.Parameters.AddWithValue("@habilitado", 0);
            comando.Parameters.AddWithValue("@id", usuario.id);
            comando.Parameters.AddWithValue("@tipo", usuario.tipo.id);
            bool ejecuta = true;
            if (HndUsuarioDepartamentos.delete(usuario) == false) ejecuta = false;
            if (HndUsuarioDepartamentos.insert(usuario) == false) ejecuta = false;
            if (Conexion.ejecutaComando(comando) == false) ejecuta = false;
            return ejecuta;
        }

        public static Boolean delete(Usuario usuario)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "DELETE FROM dbo.usuario WHERE id_usuario=@id";
            comando.Parameters.AddWithValue("@id", usuario.id);
            bool ejecuta = true;
            if (HndUsuarioDepartamentos.delete(usuario) == false) ejecuta = false;
            if (Conexion.ejecutaComando(comando) == false) ejecuta = false; 
            return ejecuta;
        }

        public static List<Usuario> getAllEnabled()
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT * FROM dbo.usuario WHERE habilitado=1");
            var usuarios = new List<Usuario>();
            foreach (DataRow dtRow in tabla.Rows)
            {
                Usuario u = new Usuario(dtRow);
                u.departamentos = HndDepartamento.getAllWhereUser(u);
                u.tipo = HndTipoUsuario.getOne(Convert.ToInt32(dtRow["id_tipo_usuario"]));
                usuarios.Add(u);
            }
            return usuarios;
        }

        public static Usuario login(Usuario u) {
            DataTable tabla = Conexion.ejecutaSelect("SELECT TOP 1 * FROM dbo.usuario WHERE nombre_de_usuario='"+ u.descripcion+"' AND pass='"+u.pass+"' AND habilitado=1");
            DataRow dtRow = tabla.Rows[0];
            Usuario usuario = new Usuario(dtRow);
            usuario.departamentos = HndDepartamento.getAllWhereUser(usuario);
            usuario.tipo = HndTipoUsuario.getOne(Convert.ToInt32(dtRow["id_tipo_usuario"]));
            return usuario;
        }

        public static bool verificarSiExiste(string nombre_de_usuario)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.usuario WHERE nombre_de_usuario='" + nombre_de_usuario+"'");
            DataRow dtRow = tabla.Rows[0];

            bool existe=false;
            if(Convert.ToInt32(dtRow[0])>0) existe=true;
            return existe;
        }

        public static bool updatePass(Usuario usuario)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "UPDATE dbo.usuario SET pass=@pass WHERE id_usuario=@id";
            comando.Parameters.AddWithValue("@pass", usuario.pass);
            comando.Parameters.AddWithValue("@id", usuario.id);
            bool ejecuta = Conexion.ejecutaComando(comando);
            return ejecuta;
        }

        public static bool verificarSiHayReclamosAsociados(Usuario usuario)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.reclamo r "+
                " INNER JOIN intervencion i "+
                " ON r.id_reclamo=i.id_reclamo "+
                " INNER JOIN derivacion d "+
                " ON r.id_reclamo=d.id_reclamo "+
                " WHERE r.id_usuario=" + usuario.id+
                " OR id_usuario_actual="+usuario.id+
                " OR i.id_usuario=" + usuario.id+
                " OR d.id_usuario_deriva=" + usuario.id+
                " OR d.id_usuario_recibe=" + usuario.id);
            DataRow dtRow = tabla.Rows[0];

            bool existe = false;
            if (Convert.ToInt32(dtRow[0]) > 0) existe = true;
            return existe;
        }

        public static bool verificarSiHayIntervencionesAsociadas(Usuario usuario)
        {
            DataTable tabla = Conexion.ejecutaSelect("SELECT COUNT(*) FROM dbo.intervencion WHERE id_usuario=" + usuario.id);
            DataRow dtRow = tabla.Rows[0];

            bool existe = false;
            if (Convert.ToInt32(dtRow[0]) > 0) existe = true;
            return existe;
        }

        public static bool disable(Usuario usuario)
        {
            SqlCommand comando = new SqlCommand();
            comando.CommandText = "UPDATE dbo.usuario SET habilitado=0 WHERE id_usuario=@id";
            comando.Parameters.AddWithValue("@id", usuario.id);
            bool ejecuta = Conexion.ejecutaComando(comando);
            return ejecuta;
        }
    }
}
